<?php

/**
 * 模型基类
 * 在CI模型上继承
 */
if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );

class MY_Model extends CI_Model
{

    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    /**
     * 锁表
     * @param array $table 需要锁定的表
     * @param bool $writelock 是否是写锁
     */
    function lock( $tables, $writelock = false )
    {
        $type = ( $writelock ) ? 'WRITE' : 'READ';
        $tmp = '';
        if ( is_array( $tables ) )
        {
            foreach ( $tables as $single )
                $tmp .= "`" . config_item( 'table_prefix' ) . $single . "` {$type},";
        }
        else
        {
            $tmp .= "`" . config_item( 'table_prefix' ) . $tables . "` {$type},";
        }
        $tmp = trim( $tmp, ',' );
        $this->db->query( "LOCK TABLE {$tmp}" );
    }

    /**
     * 解锁
     */
    function unlock()
    {
        $this->db->query( "UNLOCK TABLES" );
    }

    /**
     * 取出自增主键
     * @return int
     */
    public function insert_id()
    {
        return $this->db->insert_id();
    }

    /**
     * 取出被影响的行数
     * @return int
     */
    public function affected_rows()
    {
        return $this->db->affected_rows();
    }

    /**
     * 数据库平台
     * @return string
     */
    public function platform()
    {
        return $this->db->platform();
    }

    /**
     * 数据库版本
     * @return string
     */
    public function version()
    {
        return $this->db->version();
    }

    /**
     * 上条送入的SQL
     * @return string
     */
    public function last_query()
    {
        return $this->db->last_query();
    }

    /**
     * 开启事务
     */
    public function trans_start( $debug = false )
    {
        $this->db->trans_start( $debug );
    }
    
    /**
     * 开启事务
     */
    public function trans_begin()
    {
        $this->db->trans_begin();
    }

    /**
     * 关闭事务
     */
    public function trans_off()
    {
        $this->db->trans_off();
    }

    /**
     * 结束事务
     */
    public function trans_complete()
    {
        $this->db->trans_complete();
    }

    /**
     * 事务完成状态
     */
    public function trans_status()
    {
        $this->db->trans_status();
    }

    /**
     * 事务回滚
     */
    public function trans_rollback()
    {
        $this->db->trans_rollback();
    }

    /**
     * 事务完成
     */
    public function trans_commit()
    {
        $this->db->trans_commit();
    }

    /**
     * 根据代号获取表的真实名称
     * @param string $as 别名
     * @return string 
     */
    public function _get_table( $as )
    {
        if ( isset( $this->_table ) && isset( $this->_table[$as] ) ) return $this->_table[$as];
        return '';
    }

    public function _get_fields( $str, $table, $as = '' )
    {
        if ( !$this->_get_table( $table ) || !isset( $this->_fields[$table] ) ) return '*';
        $fields = array( );
        $tmp = explode( ',', $str );
        foreach ( $tmp as $k => $field )
        {
            if ( isset( $this->_table[$table][$field] ) ) array_push( $fields, ( $as ) ? $as . '.' . $this->_fields[$table][$field] : $this->_fields[$table][$field]  );
        }
        return implode( ',', $fields );
    }

}

?>